// using UnityEngine;
// using GGameFramework.Core.FSM;
//
// namespace GGameFramework.Examples.FSM
// {
//     /// <summary>
//     /// 玩家移动状态
//     /// </summary>
//     public class PlayerMoveState : FsmState<PlayerController>
//     {
//         private const string KEY_MOVE_INPUT = "MoveInput";
//         private const string KEY_JUMP_INPUT = "JumpInput";
//         private const string KEY_ATTACK_INPUT = "AttackInput";
//         private const string KEY_IS_GROUNDED = "IsGrounded";
//         
//         private Vector3 m_LastMoveInput;
//         private float m_MoveStartTime;
//         private const float MOVE_ANIMATION_DELAY = 0.1f; // 移动动画延迟
//         
//         protected internal override void OnInit(IFsm<PlayerController> fsm)
//         {
//             Debug.Log("移动状态初始化");
//         }
//         
//         protected internal override void OnEnter(IFsm<PlayerController> fsm)
//         {
//             PlayerController player = fsm.Owner;
//             m_MoveStartTime = 0f;
//             
//             // 设置移动动画
//             if (player.GetAnimator() != null)
//             {
//                 player.GetAnimator().SetBool("IsMoving", true);
//                 player.GetAnimator().SetBool("IsJumping", false);
//                 player.GetAnimator().SetBool("IsAttacking", false);
//             }
//             
//             // 播放移动音效
//             // player.PlaySound(moveSound);
//             
//             Debug.Log("进入移动状态");
//         }
//         
//         protected internal override void OnUpdate(IFsm<PlayerController> fsm, float elapseSeconds, float realElapseSeconds)
//         {
//             PlayerController player = fsm.Owner;
//             CharacterController characterController = player.GetCharacterController();
//             
//             // 获取输入状态
//             Vector3 moveInput = fsm.GetData<Vector3Variable>(KEY_MOVE_INPUT)?.Value ?? Vector3.zero;
//             bool jumpInput = fsm.GetData<BoolVariable>(KEY_JUMP_INPUT)?.Value ?? false;
//             bool attackInput = fsm.GetData<BoolVariable>(KEY_ATTACK_INPUT)?.Value ?? false;
//             bool isGrounded = fsm.GetData<BoolVariable>(KEY_IS_GROUNDED)?.Value ?? true;
//             
//             // 状态转换检查
//             if (attackInput && player.CanAttack())
//             {
//                 // 攻击输入优先级最高
//                 ChangeState<PlayerAttackState>(fsm);
//                 return;
//             }
//             
//             if (jumpInput && isGrounded)
//             {
//                 // 跳跃输入
//                 ChangeState<PlayerJumpState>(fsm);
//                 return;
//             }
//             
//             if (moveInput.magnitude < 0.1f)
//             {
//                 // 没有移动输入，回到空闲状态
//                 ChangeState<PlayerIdleState>(fsm);
//                 return;
//             }
//             
//             // 执行移动逻辑
//             HandleMovement(player, characterController, moveInput, elapseSeconds);
//             
//             // 更新移动动画
//             UpdateMovementAnimation(player, moveInput);
//             
//             // 检查生命值状态
//             int currentHealth = fsm.GetData<IntVariable>("Health")?.Value ?? 100;
//             if (currentHealth <= 0)
//             {
//                 ChangeState<PlayerDeathState>(fsm);
//                 return;
//             }
//         }
//         
//         protected internal override void OnLeave(IFsm<PlayerController> fsm, bool isShutdown)
//         {
//             PlayerController player = fsm.Owner;
//             
//             // 停止移动动画
//             if (player.GetAnimator() != null)
//             {
//                 player.GetAnimator().SetBool("IsMoving", false);
//             }
//             
//             Debug.Log("离开移动状态");
//         }
//         
//         protected internal override void OnDestroy(IFsm<PlayerController> fsm)
//         {
//             Debug.Log("移动状态销毁");
//         }
//         
//         /// <summary>
//         /// 处理移动逻辑
//         /// </summary>
//         private void HandleMovement(PlayerController player, CharacterController characterController, Vector3 moveInput, float deltaTime)
//         {
//             if (characterController == null) return;
//             
//             // 计算移动方向
//             Vector3 moveDirection = moveInput.normalized;
//             
//             // 应用移动速度
//             float moveSpeed = player.GetMoveSpeed();
//             Vector3 movement = moveDirection * moveSpeed * deltaTime;
//             
//             // 应用重力
//             float gravity = player.GetGravity();
//             if (!characterController.isGrounded)
//             {
//                 // 如果不在空中，切换到下落状态
//                 ChangeState<PlayerFallState>(fsm);
//                 return;
//             }
//             
//             // 执行移动
//             characterController.Move(movement);
//             
//             // 更新朝向
//             if (moveDirection != Vector3.zero)
//             {
//                 Quaternion targetRotation = Quaternion.LookRotation(moveDirection);
//                 player.transform.rotation = Quaternion.Slerp(player.transform.rotation, targetRotation, 10f * deltaTime);
//             }
//         }
//         
//         /// <summary>
//         /// 更新移动动画
//         /// </summary>
//         private void UpdateMovementAnimation(PlayerController player, Vector3 moveInput)
//         {
//             if (player.GetAnimator() == null) return;
//             
//             // 设置移动速度参数
//             float moveSpeed = moveInput.magnitude;
//             player.GetAnimator().SetFloat("MoveSpeed", moveSpeed);
//             
//             // 设置移动方向参数
//             player.GetAnimator().SetFloat("MoveX", moveInput.x);
//             player.GetAnimator().SetFloat("MoveZ", moveInput.z);
//             
//             // 延迟播放移动动画
//             m_MoveStartTime += Time.deltaTime;
//             if (m_MoveStartTime >= MOVE_ANIMATION_DELAY)
//             {
//                 player.GetAnimator().SetTrigger("MoveStart");
//                 m_MoveStartTime = 0f;
//             }
//         }
//         
//         public override string GetStateName()
//         {
//             return "移动状态";
//         }
//         
//         public override bool CanTransitionTo<TState>(IFsm<PlayerController> fsm)
//         {
//             // 移动状态可以转换到大部分状态，但不能直接转换到死亡状态
//             if (typeof(TState) == typeof(PlayerDeathState))
//             {
//                 // 需要通过其他状态间接转换
//                 return false;
//             }
//             return true;
//         }
//     }
// }
